import json
import paho.mqtt.client as mqtt
import queue

class Mqtt_Clt():
    """
    用于表征Mqtt客户端的类

    该类封装了MQTT客户端的基本功能，包括连接、订阅、发布消息以及处理接收到的消息。
    """

    def __init__(self, ip_broker, port_broker, topic_sub, topic_pub, time_out_secs):
        """
        初始化MQTT客户端并建立连接

        :param ip_broker: broker的IP地址
        :param port_broker: 连接服务的端口
        :param topic_sub: 订阅话题
        :param topic_pub: 发布话题
        :param time_out_secs: 连接超时的时间（秒）
        """
        self.mqtt_clt = mqtt.Client()  # 构造Mqtt客户端
        # self.mqtt_clt.on_connect = self.on_connect
        # self.mqtt_clt.on_connect_fail = self.on_connect_fail
        self.mqtt_clt.on_message = self.on_message  # 设置Mqtt客户端回调on_message为本类成员方法on_message
        self.topic_sub = topic_sub  # 设置订阅话题
        self.topic_pub = topic_pub  # 设置发布话题
        self.msg = {}  # 初始化接收消息的字典类成员变量msg为空({})
        self.mqtt_queue = queue.Queue(5)
        self.mqtt_clt.connect(ip_broker, port_broker, time_out_secs)  # 连接Mqtt Broker
        self.mqtt_clt.subscribe(self.topic_sub, qos=0)  # 订阅相关话题
        self.mqtt_clt.loop_start()  # 开启接收循环

    def __del__(self):
        """
        析构函数，断开MQTT连接并停止消息循环
        """
        self.mqtt_clt.loop_forever()  # 结束接收循环
        self.mqtt_clt.disconnect()  # 断开连接

    def on_message(self, client, userdata, message):
        """
        接收消息的回调函数，处理从订阅话题收到的消息

        :param client: 回调返回的客户端实例
        :param userdata: Client()或user_data_set()中设置的私有用户数据
        :param message: MQTTMessage实例,包含topic,payload,qos,retain
        """
        self.mqtt_queue.put(json.loads(message.payload.decode()))

    def send_json_msg(self, msg):
        """
        在指定的话题上发布JSON格式的消息

        :param msg: 要发送的json消息
        :return: 无
        """
        self.mqtt_clt.publish(self.topic_pub, payload="{}".format(msg))

    def control_device(self, str_key, str_value):
        """
        控制设备，通过发送键值对形式的JSON消息实现

        :param str_key: 键的字符串
        :param str_value: 值的字符串
        :return: 无
        """
        self.send_json_msg(json.dumps({str_key: str_value}))

"""
此模块定义了一个MQTT客户端类（Mqtt_Clt），用于系统与硬件设备（传送带、推杆、传感器等）之间的通信。

用途：通过MQTT协议控制硬件设备并接收传感器或图像数据。
核心组件：

初始化（__init__）：

使用paho.mqtt.client创建MQTT客户端。
设置连接参数：Broker IP、端口、订阅话题（topic_sub）、发布话题（topic_pub）和超时时间。
连接到MQTT Broker并订阅指定话题。
启动后台循环（loop_start()）处理接收的消息。
初始化一个最大容量为5的队列（mqtt_queue）存储接收到的消息。


消息处理（on_message）：

当订阅话题收到消息时调用，解码JSON负载并将其放入mqtt_queue。


消息发送（send_json_msg）：

在发布话题上发布JSON格式的消息。


设备控制（control_device）：

发送键值对格式的JSON消息控制设备，例如{"conveyor": "run"}或{"rod_control": "first_push"}。


清理（__del__）：

停止MQTT循环并断开Broker连接（但由于Python垃圾回收机制，此方法可能不总是被调用）。




用途：被main.py和test.py使用，用于发送硬件控制命令和接收传感器触发或图像数据。
"""